#ifndef SYMBOL_TABLE_H_
#define SYMBOL_TABLE_H_

#ifndef CLASSES
#define CLASSES
typedef enum  {
	CONSTANTE = 0,
	TIPO,
	VARIAVEL,
	PROCEDIMENTO,
	FUNCAO,
	CAMPO_REGISTRO,
	PALAVRA_RESERVADA
} t_classes;

#endif

#ifndef TIPOS
#define TIPOS
typedef enum {
	INTEIRO = 0,
	REAL,
	CARACTER,
	TEXT0,
	REGISTRO,
	MATRIZ,
	BOOLEANO,
	ARQUIVO,
} t_tipos;

#endif

typedef union valueSym_union{
	int inteiro;
	float real;
	char caracter;
	char *texto;
	int *outros;
}valueSym;

typedef struct POSITION {
	int line;
	int column;
} t_position;



typedef struct SYMBOLTABLE {
	char name[64];
	int level;
	int numero_matriz;
	t_classes class;
	t_tipos type;
	t_position pos;
	union {
		int inteiro;
		float real;
		char caracter;
		int *matriz;
		char *texto;
		int *outros;
	} value;
	struct SYMBOLTABLE *next;
	struct SYMBOLTABLE *prev;
	
} symbolTable;

symbolTable *head;

char* itoa(int i, char b[]);
char* returnTypeChar(t_tipos type);
t_tipos returnType(const char *string);
t_tipos returnTypeTeste(const char *string);
void value_get(symbolTable *value, t_tipos type, void *val);
void value_set(symbolTable *value, t_tipos type, void *val);
int add(symbolTable **table, char name[64], t_classes classe, t_tipos tipo, int numero_matriz);

#endif
